import axios, { AxiosRequestConfig } from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import useStore from '@/store/index'

import router from '@/router'
const state = useStore()

const request = axios.create({
	// 根据本地路径来进行请求(跨域)
	baseURL: import.meta.env.VITE_API_BASEURL,
})

// 请求拦截器
request.interceptors.request.use(
	function (config: any) {
		// 统一设置用户身份 token
		const user = state.user
		if (user && user.token) {
			config.headers.Authorization = `Bearer ${user.token}`
		}
		return config
	},
	function (error) {
		return Promise.reject(error)
	}
)

// 控制登录过期的锁
let isRefreshing = false

// 响应拦截器
request.interceptors.response.use(
	function (response) {
		// const status = response.data.status
		const status = response.data.code
		if (!status || status === 200) {
			// 正常情况
			return response
		}
		if (status === 410000) {
			// 异常情况: token 过期...
			if (isRefreshing) return Promise.reject(response)
			isRefreshing = true
			// 提示是否跳转登录页
			ElMessageBox.confirm('你的登录状态已经过期, 是否前往登录页面?', '提示', {
				confirmButtonText: '确认',
				cancelButtonText: '取消',
			})
				.then(() => {
					// 清除本地过期登录状态
					state.setUser(state, null)
					// 跳转登录页面
					router.push('login')
					// 抛出异常
				})
				.finally(() => {
					isRefreshing = false
				})
			// 内部这个消化业务异常
			return Promise.reject(response)
		}
		// 其他情况
		ElMessage.error(response.data.msg || '请求失败, 请刷新后重试')
		// 手动返回一个 Promise 异常
		return Promise.reject(response.data)
	},
	function (error) {
		// Do something with response error
		return Promise.reject(error)
	}
)

// export default request
// 接口返回数据处理
export default <T = any>(config: AxiosRequestConfig) => {
	return request(config).then(res => {
		return (res.data.data || res.data) as T
	})
}
